#include "video.h"
#include "ui_video.h"

Video::Video(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Video)
{

    ui->setupUi(this);
    // 创建 UDP 套接字对象
    udpSocket = new QUdpSocket(this);
    // 创建定时器对象
    timer = new QTimer(this);
    // 连接定时器，计时完成，触发槽函数
    connect(timer, &QTimer::timeout, this, &Video::sendRequest);
    // 连接打开监控按钮到sendRequest 槽函数，当按钮被点击时触发
    connect(ui->open, SIGNAL(clicked()), this, SLOT(sendRequest()));
    // 连接关闭监控按钮到sendRequest 槽函数，当按钮被点击时触发
    connect(ui->close, SIGNAL(clicked()), this, SLOT(sendRequest()));
    // 连接 UDP 套接字的 readyRead 信号到 processDatagrams 槽函数，当有数据可读时触发
    connect(udpSocket, SIGNAL(readyRead()), this, SLOT(processDatagrams()));
    // 连接截图按钮的点击信号到 takeScreenshot 槽函数
    connect(ui->screen, SIGNAL(clicked()), this, SLOT(takeScreenshot()));
    // 连接保存按钮的点击信号到 saveScreenshot 槽函数
    connect(ui->save, SIGNAL(clicked()), this, SLOT(saveScreenshot()));
}

Video::~Video()
{
    delete ui;
}

void Video::sendRequest()
{
    // 创建QString对象记录按钮状态

    // 打开定时器
    timer->start(1);
    // 如果点击open按钮
    if(sender() == ui->open)
    {
        // 获取按钮文本内容
        request = "open";
    }
    // 如果点击close按钮
   if(sender() == ui->close)
   {
        request = "close";
        qDebug() << "clsoe";
        ui->video->setText("");

   }
   if(request == "open")
   {
       // 将请求转换为 UTF-8 编码的字节数组
       QByteArray data = request.toUtf8();
       // 向指定的 IP 地址和端口发送数据报
        udpSocket->writeDatagram(data, QHostAddress("192.168.239.33"), 8888);
   }
   else
   {

   }

}


// 处理待接收的数据报槽函数
void Video::processDatagrams()
{
    // 循环处理所有待处理的数据报
    while (udpSocket->hasPendingDatagrams()) {
        // 创建一个字节数组用于存储接收到的数据
        QByteArray datagram;
        // 设置字节数组的大小为当前待处理数据报的大小
        datagram.resize(udpSocket->pendingDatagramSize());
        // 创建一个地址对象用于存储发送方的地址
        QHostAddress sender;
        // 创建一个无符号短整型变量用于存储发送方的端口号
        quint16 senderPort;
        // 从 UDP 套接字读取数据报，将数据存储到字节数组中，并获取发送方地址和端口号
        udpSocket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);
        // 创建QImage对象
        QImage image;
        // 检查QByteArray是否为空
        if (!datagram.isEmpty())
        {
            // 将QByteArray的数据复制到QImage中
            image.loadFromData(datagram);
        }
        else
        {
            qDebug() << "datagram is empty";
        }
        // 检查图像是否加载成功
        if (!image.isNull())
        {
            // 将图像设置为视频标签的像素图，以显示图像
            ui->video->setPixmap(QPixmap::fromImage(image));
        }
        else
        {
            qDebug() << "image is null";
        }
    }
}


// 截图槽函数
void Video::takeScreenshot()
{
    if(request == "open")
    {
       // 抓取视频流的内容作为图像
        screenshot = ui->video->grab().toImage();
       // 将抓取到的图像设置为截图预览标签的图像
        ui->picture->setPixmap(QPixmap::fromImage(screenshot));
    }
    else
    {
        QMessageBox::information(this,"Information","请先打开监控");
        //ui->picture->setText("请先打开监控");
    }
}


void Video::saveScreenshot()
{
    // 弹出文件对话框让用户选择保存路径
    QString savePath = QFileDialog::getExistingDirectory(this, "选择保存路径");

    // 如果用户选择了有效的保存路径
    if (!savePath.isEmpty())
    {
        // 获取当前时间
        QDateTime currentTime = QDateTime::currentDateTime();
        // 构建保存的文件名，格式为：路径/年-月-日_时-分-秒.png
        QString fileName = savePath + "/" + currentTime.toString("yyyy.MM.dd_hh.mm.ss") + ".png";
        // 将截图保存为 PNG 格式的图片
        screenshot.save(fileName, "PNG");
        // 在调试输出中显示保存成功的信息
        qDebug() << "截图保存成功：" << fileName;
    }
    else
    {
        // 如果用户未选择保存路径，在调试输出中显示未保存的信息
        qDebug() << "未选择保存路径，截图未保存。";
    }
}

